const basicAuth = require('basic-auth') //BasicAuth 的原理和实现. 简单来说, 它是检查你的 Headers 中的Authorization. 从中解析出 username 和 password, 和服务器保存的进行对比, 如果一致则通过, 否则返回 401/403 状态码, 表示客户端没有携带或携带了错误的认证信息

const jwt = require('jsonwebtoken')

class Auth {
    constructor(level) {
        this.level = level || 1

        Auth.USER= 8
        Auth.ADMIN = 16
        Auth.SPUSER_ADMIN = 32
    }

    get m() {
        // token 检测
        // token 开发者 传递令牌
        // token body header
        // HTTP 规定 身份验证机制 HttpBasicAuth
     
        return async (ctx, next) => {
            const tokenToken = basicAuth(ctx.req)

            let errMsg = "token不合法"

            // 无带token
            if (!tokenToken || !tokenToken.name) {
                throw new global.errs.Forbidden(errMsg)
            }

            try {
                var decode = jwt.verify(tokenToken.name, global.config.security.secretKey) //第一个Token 第二个密钥

            } catch (error) {
                // token 不合法 过期
                if (error.name === 'TokenExpiredError') {
                    errMsg = "token已过期"
                }

                throw new global.errs.Forbidden(errMsg)
            }

            if (decode.scope <= this.level) {
                errMsg = "权限不足"
                throw new global.errs.Forbidden(errMsg)
            }

            ctx.auth = {
                uid: decode.uid,
                scope: decode.scope
            }

            await next()
        }
    }

    // 验证token是否有效
    static verifyToken(token) {
        console.log(token,11)
        try {
            jwt.verify(token, global.config.security.secretKey) //验证Token ，密钥

            return true;
        } catch (e) {
            return false
        }
    }

}

module.exports = {
    Auth
}